1 Introducción

En el corazón de la economía global existe una paradoja fundamental: mientras que algunos indicadores sugieren una relación lineal y predecible entre el desarrollo económico y el bienestar social, la realidad es mucho más compleja y matizada. Tomemos un ejemplo: Costa Rica tiene una esperanza de vida comparable a la de países europeos desarrollados, pero con un PIB per cápita significativamente menor; Qatar, por su parte, lidera en PIB per cápita pero no encabeza necesariamente en todos los indicadores de bienestar social (Shkolnikov et al., 2019). Estas “anomalías” no son excepciones sino revelaciones de una verdad fundamental: el desarrollo no es unidimensional.

El problema central que motiva este trabajo es fundamental: ¿Cuáles son realmente los “tipos” de desarrollo que caracterizan la economía mundial cuando se analiza simultáneamente un conjunto amplio de 17 indicadores económicos, sociales, tecnológicos y ambientales? No se trata de responder cuál país es más “rico”, sino algo más profundo: descubrir si existen estructuras ocultas en los datos que agrupen países con perfiles similares más allá de la geografía o las clasificaciones convencionales. Específicamente, la pregunta es: ¿Colombia y Uruguay podrían compartir más similitudes con algunos países asiáticos que con sus propios vecinos latinoamericanos? ¿Existe realmente un “grupo de países con baja renta pero alto acceso tecnológico”? ¿Las características ambientales y demográficas se alinean con la riqueza económica o presentan patrones independientes?

Históricamente, el desarrollo internacional se ha medido mediante indicadores aislados. El PIB per cápita domina los rankings; la esperanza de vida se analiza independientemente; la conectividad digital se observa separadamente. Este enfoque fragmentado es problemático porque el desarrollo no es unidimensional: un país puede ser económicamente exitoso pero frágil en salud pública, o tener excelente conectividad digital pero vulnerabilidad ambiental crítica (Jolliffe, 2002; World Bank, 2023). Los datos del año 2022 capturan un momento único en la historia económica global: post-pandemia de COVID-19, con efectos heterogéneos según país. Algunos recuperaron rápidamente su dinamismo; otros enfrentaron cicatrices estructurales persistentes en empleo, salud y finanzas públicas (World Bank, 2023).

El Banco Mundial proporciona 17 indicadores reconocidos internacionalmente que miden dimensiones distintas: factores económicos (PIB per cápita, crecimiento del PIB, inversión extranjera, remesas, industria, comercio), indicadores de salud y bienestar (esperanza de vida, mortalidad infantil, gasto en salud), variables de conectividad tecnológica (acceso a electricidad, uso de internet, suscripciones móviles) y aspectos ambientales y demográficos (área boscosa, tierra cultivable, crecimiento poblacional) (World Bank, 2023). Analizar estas 17 variables de forma independiente genera ruido; analizarlas de manera integrada puede revelar patrones coherentes que informan políticas públicas, estrategias de cooperación internacional y decisiones de inversión.

El desafío es modelar una pregunta sin respuesta predefinida: ¿Qué agrupamientos naturales de países emergen cuando se analiza simultáneamente esta multiplicidad de indicadores? Este es precisamente el rol del aprendizaje no supervisado—un conjunto de técnicas que descubren patrones en datos sin etiquetas previas, sin clasificaciones arbitrarias impuestas externamente (Charrad et al., 2014; Jolliffe, 2002).

Lo que sigue es una cartografía multidimensional de la economía global en el contexto post-pandemia: no solo se responde “¿en qué grupos se dividen los países?”, sino, más profundamente, “¿qué revelan estos grupos sobre mecanismos reales del desarrollo, oportunidades compartidas, restricciones comunes y trayectorias viables para diferentes sociedades?” Los resultados no serán una clasificación administrativa sino un descubrimiento empírico basado en lo que los datos de 180 países en 2022 efectivamente revelan.

2 Metodologia

2.1 Base de datos

La base de datos utilizada en este análisis proviene de la compilación World Development Indicators (WDI) del Banco Mundial, considerada la principal fuente internacional de estadísticas comparables sobre desarrollo económico y social (World Bank, 2023). Los WDI representan el esfuerzo más comprehensivo del Banco Mundial para consolidar indicadores de desarrollo de fuentes oficialmente reconocidas, incluyendo oficinas nacionales de estadística, bancos centrales, agencias de las Naciones Unidas, instituciones de investigación y contribuyentes del sector privado (World Bank, 2023; Jeanty, 2010).

La base WDI contiene aproximadamente 1,600 indicadores de series temporales para 217 economías y más de 40 grupos de países, con datos para muchos indicadores que se remontan más de 50 años (World Bank, 2023). Los datos son compilados mediante metodologías estandarizadas que garantizan comparabilidad internacional, transparencia metodológica y robustez estadística (World Bank, 2019). El proceso de selección de indicadores del WDI sigue cuatro criterios fundamentales: facilidad de uso (accesibilidad y claridad para usuarios diversos), confiabilidad (reputación y credibilidad de la fuente), cobertura (amplitud geográfica y temporal), y calidad (rigor metodológico y precisión) (Behar & Mok, 2024).

Para este análisis, se filtro información exclusivamente para países individuales (eliminando bloques regionales o agrupaciones económicas) del año 2022. El dataset resultante contiene aproximadamente 180-200 países, según la disponibilidad de datos completos, donde cada observación representa una unidad soberana comparable en un único punto temporal.

El año 2022 marca un punto de inflexión crítico en la economía global, representa el momento post-pandemia en que las trayectorias de recuperación de cada país se hacen visibles y diferenciadas. Mientras algunos países desarrollados con capacidad fiscal recuperaron o superaron niveles pre-COVID-19, economías emergentes enfrentaban cicatrices estructurales persistentes en empleo, inflación descontrolada, y aumento de deuda pública (Banco Mundial, 2022; FMI, 2023; CEPAL, 2023). La desigualdad global se amplió drásticamente: el crecimiento proyectado para América Latina en 2022 era apenas 2.6%, mientras la desigualdad de ingresos aumentó significativamente después de dos décadas de mejoras (BID, 2022).

En este contexto, 2022 funciona como un “revelador” excepcional de vulnerabilidades y fortalezas estructurales subyacentes de los países: aquellos con sistemas de salud robustos, infraestructura tecnológica consolidada y economías diversificadas mostraron resiliencia; los que enfrentaban fragilidades estructurales experimentaron impactos persistentes (Banco Mundial, 2022; CIDOB, 2022). Por tanto, 2022 es un año extraordinariamente informativo para identificar perfiles reales de desarrollo, ya que las diferencias entre países se magnificaron visiblemente, permitiendo observar no clasificaciones arbitrarias sino estructuras auténticas de capacidad nacional.

2.2 Descripción de las variables

El dataset construido para este análisis integra 17 variables cuantitativas que capturan las múltiples dimensiones del desarrollo contemporáneo. Estas variables se organizan en cinco áreas temáticas que, en conjunto, ofrecen una perspectiva comprehensiva del desempeño socioeconómico, tecnológico y ambiental de cada país. A continuación, se presenta una descripción detallada de cada variable según su área temática.

2.2.1 Dimensión economica

La inclusión de variables económicas es fundamental porque el desarrollo ha sido históricamente conceptualizado como un proceso de transformación estructural impulsado por el crecimiento económico (World Bank, 2023; Piketty, 2022). Sin embargo, el crecimiento económico no es unidimensional: requiere tanto un nivel absoluto de riqueza (PIB per cápita) como dinamismo y expansión (crecimiento del PIB), diversificación productiva (industria), y capacidad de atracción de inversión internacional (IED) que transfiera conocimiento y capital (ECB, 2018). Además, las economías contemporáneas están integradas globalmente, por lo que exportaciones, importaciones y remesas son transmisores clave de oportunidades y vulnerabilidades económicas (World Bank, 2023)., en la tabla 1 las observamos.

variables_economicas <- data.frame(
  Variable = c(
    "PIB per cápita (US$)",
    "Crecimiento del PIB (% anual)",
    "Inversión extranjera directa (% PIB)",
    "Remesas recibidas (% PIB)",
    "Industria (% PIB)",
    "Exportaciones (% PIB)",
    "Importaciones (% PIB)"
  ),
  
  Descripción = c(
    "PIB dividido por población, en dólares corrientes. Indicador principal del nivel de ingreso y producción económica por persona.",
    "Tasa de variación anual del PIB en precios constantes. Refleja la expansión o contracción económica de un país.",
    "Flujos netos de inversión con interés gerencial duradero. Fuente crucial de financiamiento externo y transferencia tecnológica.",
    "Transferencias personales de migrantes que trabajan en el extranjero. Flujo financiero clave para muchas economías en desarrollo.",
    "Valor agregado del sector industrial. Refleja el grado de industrialización y la estructura productiva de una economía.",
    "Valor de bienes y servicios vendidos al exterior. Mide el grado de apertura comercial y oportunidades de crecimiento.",
    "Valor de bienes y servicios comprados al exterior. Indica la dependencia de la economía respecto al comercio internacional."
  ),
  
  Interpretación = c(
    ">20,000 USD: economía desarrollada\n5,000-20,000 USD: economía emergente\n<5,000 USD: economía en desarrollo",
    ">3%: crecimiento robusto\n0-3%: crecimiento moderado\n<0%: recesión económica",
    ">5%: alta atracción de IED\n2-5%: nivel moderado\n<2%: baja atracción de inversión",
    ">10%: alta dependencia\n2-10%: contribución significativa\n<2%: impacto limitado",
    ">30%: economía industrializada\n20-30%: sector industrial sólido\n<20%: base industrial reducida", 
    ">50%: economía muy abierta\n30-50%: apertura moderada\n<30%: economía relativamente cerrada",
    ">40%: alta dependencia importaciones\n25-40%: nivel moderado\n<25%: autosuficiencia relativa"
  )
)

tabla_1 <- variables_economicas %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 1**"),
    subtitle = "Variables Macroeconómicas y su Interpretación"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(8),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023), UN (2015), ECB (2018)")
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y temporal",
    locations = cells_title(groups = "subtitle")
  )

tabla_1
Tabla 1
Variables Macroeconómicas y su Interpretación1
Variable Descripción Interpretación
PIB per cápita (US$) PIB dividido por población, en dólares corrientes. Indicador principal del nivel de ingreso y producción económica por persona. >20,000 USD: economía desarrollada 5,000-20,000 USD: economía emergente <5,000 USD: economía en desarrollo
Crecimiento del PIB (% anual) Tasa de variación anual del PIB en precios constantes. Refleja la expansión o contracción económica de un país. >3%: crecimiento robusto 0-3%: crecimiento moderado <0%: recesión económica
Inversión extranjera directa (% PIB) Flujos netos de inversión con interés gerencial duradero. Fuente crucial de financiamiento externo y transferencia tecnológica. >5%: alta atracción de IED 2-5%: nivel moderado <2%: baja atracción de inversión
Remesas recibidas (% PIB) Transferencias personales de migrantes que trabajan en el extranjero. Flujo financiero clave para muchas economías en desarrollo. >10%: alta dependencia 2-10%: contribución significativa <2%: impacto limitado
Industria (% PIB) Valor agregado del sector industrial. Refleja el grado de industrialización y la estructura productiva de una economía. >30%: economía industrializada 20-30%: sector industrial sólido <20%: base industrial reducida
Exportaciones (% PIB) Valor de bienes y servicios vendidos al exterior. Mide el grado de apertura comercial y oportunidades de crecimiento. >50%: economía muy abierta 30-50%: apertura moderada <30%: economía relativamente cerrada
Importaciones (% PIB) Valor de bienes y servicios comprados al exterior. Indica la dependencia de la economía respecto al comercio internacional. >40%: alta dependencia importaciones 25-40%: nivel moderado <25%: autosuficiencia relativa
1 Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y temporal
Fuentes: Elaboración propia con base en World Bank (2023), UN (2015), ECB (2018)

2.2.2 Dimension de salud y bienestar

La inclusión de variables sanitarias responde a que el desarrollo no es puramente económico sino que debe reflejarse en mejoras sustantivas en la calidad de vida, particularmente en indicadores de salud poblacional (Sachs et al., 2022; World Bank, 2023). La esperanza de vida es considerada por organismos internacionales como el indicador sintético más robusto de desarrollo humano, capturando tanto el acceso a servicios de salud como condiciones generales de vida (OECD, 2024). La mortalidad infantil es particularmente sensible a la calidad del sistema sanitario, y el gasto en salud refleja el esfuerzo institucional de un país por asegurar bienestar poblacional (World Bank, 2023)., en la tabla 2 las observamos.

variables_salud <- data.frame(
  Variable = c(
    "Esperanza de vida al nacer (años)",
    "Mortalidad infantil (por cada 1,000 nacidos vivos)",
    "Gasto en salud (% del PIB)"
  ),
  
  Descripción = c(
    "Número promedio de años que se espera que viva un recién nacido si los patrones de mortalidad prevalecientes al momento de su nacimiento permanecen constantes a lo largo de su vida. Es uno de los indicadores más robustos para medir el estado de salud poblacional, reflejando la calidad del sistema sanitario, acceso a servicios médicos, condiciones de vida, nutrición y factores ambientales.",
    "Número de muertes de niños menores de un año por cada 1,000 nacimientos vivos. Es un indicador sensible de la calidad de atención sanitaria materno-infantil, condiciones sanitarias, acceso a agua potable y nutrición adecuada, funcionando como proxy de desarrollo social y capacidad institucional del sistema de salud.",
    "Gasto corriente en salud expresado como porcentaje del PIB, incluyendo tanto gasto público como privado. Refleja la prioridad presupuestaria que un país asigna al sector salud y su capacidad de financiar infraestructura sanitaria, siendo un determinante clave de resultados de salud poblacional."
  ),
  
  Interpretación = c(
    ">75 años: salud poblacional avanzada\n70-75 años: nivel medio de desarrollo sanitario\n<70 años: desafíos significativos en salud pública",
    "<10: excelentes condiciones sanitarias\n10-25: condiciones moderadas\n>25: necesidades críticas en salud infantil",
    ">8%: alta prioridad en salud\n5-8%: compromiso moderado\n<5%: recursos sanitarios limitados"
  )
)

tabla_2 <- variables_salud %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 2**"),
    subtitle = "Indicadores de Salud Pública y su Interpretación"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(8),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en WHO (2020), OECD (2024), World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo",
    locations = cells_title(groups = "subtitle")
  ) %>%
  tab_style(
    style = cell_text(whitespace = "normal"),
    locations = cells_body()
  )

tabla_2
Tabla 2
Indicadores de Salud Pública y su Interpretación1
Variable Descripción Interpretación
Esperanza de vida al nacer (años) Número promedio de años que se espera que viva un recién nacido si los patrones de mortalidad prevalecientes al momento de su nacimiento permanecen constantes a lo largo de su vida. Es uno de los indicadores más robustos para medir el estado de salud poblacional, reflejando la calidad del sistema sanitario, acceso a servicios médicos, condiciones de vida, nutrición y factores ambientales. >75 años: salud poblacional avanzada 70-75 años: nivel medio de desarrollo sanitario <70 años: desafíos significativos en salud pública
Mortalidad infantil (por cada 1,000 nacidos vivos) Número de muertes de niños menores de un año por cada 1,000 nacimientos vivos. Es un indicador sensible de la calidad de atención sanitaria materno-infantil, condiciones sanitarias, acceso a agua potable y nutrición adecuada, funcionando como proxy de desarrollo social y capacidad institucional del sistema de salud. <10: excelentes condiciones sanitarias 10-25: condiciones moderadas >25: necesidades críticas en salud infantil
Gasto en salud (% del PIB) Gasto corriente en salud expresado como porcentaje del PIB, incluyendo tanto gasto público como privado. Refleja la prioridad presupuestaria que un país asigna al sector salud y su capacidad de financiar infraestructura sanitaria, siendo un determinante clave de resultados de salud poblacional. >8%: alta prioridad en salud 5-8%: compromiso moderado <5%: recursos sanitarios limitados
1 Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo
Fuentes: Elaboración propia con base en WHO (2020), OECD (2024), World Bank (2023)

2.2.3 Dimension tecnologica y de conectividad

La inclusión de variables tecnológicas es justificada por la importancia creciente de la transformación digital en el desarrollo contemporáneo (UNCTAD, 2021; World Bank, 2023). La acceso a electricidad, internet y telefonía móvil no son lujos sino infraestructuras esenciales que habilitan participación en la economía del conocimiento, acceso a información, servicios financieros y oportunidades económicas (UNCTAD, 2021). La brecha digital ha emergido como una nueva dimensión de desigualdad internacional, donde países con penetración digital menor enfrentan desventajas competitivas significativas (World Bank, 2023)., en la tabla 3 las observamos.

variables_tecnologia <- data.frame(
  Variable = c(
    "Acceso a electricidad (% de la población)",
    "Uso de internet (% de la población)",
    "Suscripciones móviles (por cada 100 personas)"
  ),
  
  Descripción = c(
    "Porcentaje de la población con acceso a electricidad. Indicador fundamental de infraestructura energética básica, condición necesaria para actividad económica moderna, educación, salud y conectividad digital.",
    "Porcentaje de individuos que han utilizado internet en los últimos 3 meses. Proxy de conectividad digital, acceso a información, y participación en la economía del conocimiento, siendo cada vez más relevante para productividad económica y reducción de brechas informativas.",
    "Número de suscripciones a servicios de telefonía celular móvil por cada 100 habitantes. Refleja la penetración de tecnología móvil, que ha sido un vector fundamental de inclusión digital y acceso a servicios financieros en economías en desarrollo."
  ),
  
  Interpretación = c(
    ">95%: cobertura eléctrica universal\n80-95%: acceso extendido\n<80%: déficit significativo de infraestructura",
    ">70%: sociedad digitalmente integrada\n30-70%: adopción media de internet\n<30%: brecha digital significativa",
    ">100: alta penetración móvil\n80-100: cobertura adecuada\n<80: oportunidades de expansión del mercado"
  )
)

tabla_3 <- variables_tecnologia %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 3**"),
    subtitle = "Indicadores de Infraestructura y Tecnología"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(8),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Los valores superiores a 100 en suscripciones móviles indican múltiples suscripciones por persona",
    locations = cells_body(
      rows = 3,
      columns = Interpretación
    )
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el nivel de desarrollo regional",
    locations = cells_title(groups = "subtitle")
  )

tabla_3
Tabla 3
Indicadores de Infraestructura y Tecnología1
Variable Descripción Interpretación
Acceso a electricidad (% de la población) Porcentaje de la población con acceso a electricidad. Indicador fundamental de infraestructura energética básica, condición necesaria para actividad económica moderna, educación, salud y conectividad digital. >95%: cobertura eléctrica universal 80-95%: acceso extendido <80%: déficit significativo de infraestructura
Uso de internet (% de la población) Porcentaje de individuos que han utilizado internet en los últimos 3 meses. Proxy de conectividad digital, acceso a información, y participación en la economía del conocimiento, siendo cada vez más relevante para productividad económica y reducción de brechas informativas. >70%: sociedad digitalmente integrada 30-70%: adopción media de internet <30%: brecha digital significativa
Suscripciones móviles (por cada 100 personas) Número de suscripciones a servicios de telefonía celular móvil por cada 100 habitantes. Refleja la penetración de tecnología móvil, que ha sido un vector fundamental de inclusión digital y acceso a servicios financieros en economías en desarrollo. >100: alta penetración móvil 80-100: cobertura adecuada <80: oportunidades de expansión del mercado2
1 Los umbrales de interpretación son referenciales y pueden variar según el nivel de desarrollo regional
2 Los valores superiores a 100 en suscripciones móviles indican múltiples suscripciones por persona
Fuentes: Elaboración propia con base en World Bank (2023)

2.2.4 Dimension ambiental y de recursos

La inclusión de variables ambientales responde al creciente reconocimiento de que el desarrollo sostenible debe integrar consideraciones ecológicas (PNUD, 2023; World Bank, 2023). Aunque el crecimiento económico tradicional ha sido alcanzado frecuentemente mediante degradación ambiental, la sostenibilidad del desarrollo requiere preservación de capital natural, particularmente bosques (para captura de carbono y biodiversidad) y tierra cultivable (para seguridad alimentaria) (PNUD, 2023; World Bank, 2023), en la tabla 4 las vemos.

variables_ambientales <- data.frame(
  Variable = c(
    "Área boscosa (% del área terrestre)",
    "Tierra cultivable (% del área terrestre)"
  ),
  
  Descripción = c(
    "Porcentaje del territorio nacional cubierto por bosques. Es un indicador de conservación ambiental, biodiversidad y sostenibilidad, siendo relevante tanto para mitigación del cambio climático como para servicios ecosistémicos.",
    "Porcentaje de tierra apta para cultivos agrícolas. Refleja el potencial agrícola y la base de recursos naturales para producción de alimentos, siendo particularmente relevante para economías con sectores agrícolas significativos."
  ),
  
  Interpretación = c(
    ">30%: alta cobertura forestal\n15-30%: cobertura media\n<15%: deforestación significativa",
    ">20%: alta disponibilidad agrícola\n10-20%: capacidad moderada\n<10%: limitaciones para agricultura"
  )
)

tabla_4 <- variables_ambientales %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 4**"),
    subtitle = "Indicadores Ambientales y de Uso de la Tierra"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(8),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Los servicios ecosistémicos incluyen regulación hídrica, conservación de biodiversidad y secuestro de carbono",
    locations = cells_body(
      rows = 1,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "La tierra cultivable incluye tierras arables, cultivos permanentes y pastos permanentes",
    locations = cells_body(
      rows = 2,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación pueden variar según las características geográficas y ecológicas de cada región",
    locations = cells_title(groups = "subtitle")
  )

tabla_4
Tabla 4
Indicadores Ambientales y de Uso de la Tierra1
Variable Descripción Interpretación
Área boscosa (% del área terrestre) Porcentaje del territorio nacional cubierto por bosques. Es un indicador de conservación ambiental, biodiversidad y sostenibilidad, siendo relevante tanto para mitigación del cambio climático como para servicios ecosistémicos.2 >30%: alta cobertura forestal 15-30%: cobertura media <15%: deforestación significativa
Tierra cultivable (% del área terrestre) Porcentaje de tierra apta para cultivos agrícolas. Refleja el potencial agrícola y la base de recursos naturales para producción de alimentos, siendo particularmente relevante para economías con sectores agrícolas significativos.3 >20%: alta disponibilidad agrícola 10-20%: capacidad moderada <10%: limitaciones para agricultura
1 Los umbrales de interpretación pueden variar según las características geográficas y ecológicas de cada región
2 Los servicios ecosistémicos incluyen regulación hídrica, conservación de biodiversidad y secuestro de carbono
3 La tierra cultivable incluye tierras arables, cultivos permanentes y pastos permanentes
Fuentes: Elaboración propia con base en World Bank (2023)

2.2.5 Dimension demografica

La inclusión de variables demográficas es justificada porque la dinámica poblacional condiciona fundamentalmente los desafíos y oportunidades de desarrollo: presión sobre recursos, mercado laboral, demanda por servicios públicos, y sostenibilidad fiscal (CEPAL, 2023; World Bank, 2023). Países con crecimiento poblacional acelerado enfrentan distintos desafíos que aquellos con envejecimiento poblacional, impactando tasas de ahorro, inversión, y provisión de servicios (CEPAL, 2023), vemos las variables en la tabla 5.

variables_demograficas <- data.frame(
  Variable = c(
    "Población total",
    "Crecimiento poblacional (% anual)"
  ),
  
  Descripción = c(
    "Número total de habitantes de un país a mitad de año. El tamaño poblacional determina tanto el mercado interno como la escala de demanda por servicios públicos y recursos naturales.",
    "Tasa de variación porcentual anual de la población. Refleja la presión demográfica y sus implicaciones para sostenibilidad, mercados laborales, y provisión de servicios públicos."
  ),
  
  Interpretación = c(
    ">100M: país muy poblado\n10-100M: población media\n<10M: país poco poblado",
    ">2%: crecimiento rápido\n0.5-2%: crecimiento moderado\n<0.5%: crecimiento lento"
  )
)

tabla_5 <- variables_demograficas %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 5**"),
    subtitle = "Indicadores Demográficos Básicos"
  ) %>%
  cols_label(
    Variable = md("**Variable**"),
    Descripción = md("**Descripción**"),
    Interpretación = md("**Interpretación**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable, Descripción))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Variable)
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = c(Descripción, Interpretación))
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(8),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "La población se refiere a residentes totales independientemente de su estatus legal o ciudadanía",
    locations = cells_body(
      rows = 1,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "El crecimiento poblacional incluye nacimientos, muertes y migración neta",
    locations = cells_body(
      rows = 2,
      columns = Descripción
    )
  ) %>%
  tab_footnote(
    footnote = "Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo",
    locations = cells_title(groups = "subtitle")
  )

tabla_5
Tabla 5
Indicadores Demográficos Básicos1
Variable Descripción Interpretación
Población total Número total de habitantes de un país a mitad de año. El tamaño poblacional determina tanto el mercado interno como la escala de demanda por servicios públicos y recursos naturales.2 >100M: país muy poblado 10-100M: población media <10M: país poco poblado
Crecimiento poblacional (% anual) Tasa de variación porcentual anual de la población. Refleja la presión demográfica y sus implicaciones para sostenibilidad, mercados laborales, y provisión de servicios públicos.3 >2%: crecimiento rápido 0.5-2%: crecimiento moderado <0.5%: crecimiento lento
1 Los umbrales de interpretación son referenciales y pueden variar según el contexto regional y nivel de desarrollo
2 La población se refiere a residentes totales independientemente de su estatus legal o ciudadanía
3 El crecimiento poblacional incluye nacimientos, muertes y migración neta
Fuentes: Elaboración propia con base en World Bank (2023)

2.3 Base de datos del modelo

A continuacion, se muestra la base de datos que se usara para el modelo de aprendizaje no supervisado.

Base_2022 <- read_csv("f36a5086-3311-4b1a-9f0c-bda5cd4718df_Series - Metadata.csv",
                 show_col_types = FALSE) %>%
  select(
    Pais = `Country Name`,
    Codigo = `Country Code`,
    PIB_per = `GDP per capita (current US$) [NY.GDP.PCAP.CD]`,
    Poblacion = `Population, total [SP.POP.TOTL]`,
    `Esperanza vida` = `Life expectancy at birth, total (years) [SP.DYN.LE00.IN]`,
    `Acceso electricidad` = `Access to electricity (% of population) [EG.ELC.ACCS.ZS]`,
    `Area boscosa` = `Forest area (% of land area) [AG.LND.FRST.ZS]`,
    `Suscripciones movil` = `Mobile cellular subscriptions (per 100 people) [IT.CEL.SETS.P2]`,
    `Crecimiento PIB` = `GDP growth (annual %) [NY.GDP.MKTP.KD.ZG]`,
    `Mortalidad infantil` = `Mortality rate, infant (per 1,000 live births) [SP.DYN.IMRT.IN]`,
    `Inversion extranjera` = `Foreign direct investment, net inflows (% of GDP) [BX.KLT.DINV.WD.GD.ZS]`,
    `Gasto salud` = `Current health expenditure (% of GDP) [SH.XPD.CHEX.GD.ZS]`,
    `Uso internet` = `Individuals using the Internet (% of population) [IT.NET.USER.ZS]`,
    Importaciones = `Imports of goods and services (% of GDP) [NE.IMP.GNFS.ZS]`,
    Exportaciones = `Exports of goods and services (% of GDP) [NE.EXP.GNFS.ZS]`,
    `Tierra cultivable` = `Arable land (% of land area) [AG.LND.ARBL.ZS]`,
    `Crecimiento poblacion` = `Population growth (annual %) [SP.POP.GROW]`,
    Industria = `Industry (including construction), value added (% of GDP) [NV.IND.TOTL.ZS]`,
    Remesas = `Personal remittances, received (% of GDP) [BX.TRF.PWKR.DT.GD.ZS]`
  )%>%
  filter(!Pais %in% c("World", "High income", "Low income", "European Union",
                      "Latin America & Caribbean", "Middle income", "OECD members",
                      "East Asia & Pacific", "Sub-Saharan Africa", "South Asia",
                      "North America", "Euro area", "Arab World", "West Bank and Gaza",
                      "Lower middle income", "Upper middle income", 
                      "Least developed countries: UN classification",
                      "Fragile and conflict affected situations", 
                      "Heavily indebted poor countries (HIPC)",
                      "IDA total", "Low & middle income", "Middle East & North Africa",
                      "Pacific island small states", "Small states", 
                      "Caribbean small states", "Other small states", 
                      "IDA & IBRD total", "IDA only", "IBRD only",
                      "Pre-demographic dividend", "Post-demographic dividend", 
                      "Early-demographic dividend", "Late-demographic dividend")) %>% 
  mutate(across(3:19, as.numeric)) %>% drop_na()%>% 
  filter(Pais != c( "Luxembourg","  Uruguay", "Angola","Jordan","Belize")) %>% 
  filter(Codigo != "BLZ",Codigo!="JOR",Codigo!="URY")


tabla_inicial <- datatable(
  Base_2022,
  extensions = c('Buttons', 'Scroller', 'Responsive', 'FixedHeader'),
  options = list(
    dom = '<"top"lBf>rt<"bottom"ip><"clear">',
    buttons = list(
      list(extend = 'copy', text = 'Copiar', className = 'btn-outline-primary'),
      list(extend = 'csv', text = 'CSV', className = 'btn-outline-secondary'),
      list(extend = 'excel', text = 'Excel', className = 'btn-outline-success'),
      list(extend = 'pdf', text = 'PDF', className = 'btn-outline-danger'),
      list(extend = 'print', text = 'Imprimir', className = 'btn-outline-warning')
    ),
    pageLength = 12,
    lengthMenu = list(c(8, 12, 20, 50, -1), 
                     c('8', '12', '20', '50', 'Todos')),
    scrollX = TRUE,
    scrollY = "550px",
    scroller = TRUE,
    deferRender = TRUE,
    language = list(
      url = '//cdn.datatables.net/plug-ins/1.13.4/i18n/es-ES.json',
      search = "Buscar:",
      lengthMenu = "Mostrar _MENU_ registros",
      info = "_START_ - _END_ de _TOTAL_",
      paginate = list(
        first = "Primero",
        last = "Último",
        `next` = "Siguiente",
        previous = "Anterior"
      )
    ),
    autoWidth = TRUE,
    fixedHeader = TRUE,
    searchHighlight = TRUE
  ),
  rownames = FALSE,
  filter = 'top',
  class = c('display', 'compact', 'hover'),
  caption = 'Indicadores Económicos y Sociales Globales 2022'
) %>%
  formatCurrency(
    columns = 'PIB_per', 
    currency = "$", 
    digits = 0,
    before = TRUE
  ) %>%
  formatRound(
    columns = 'Poblacion', 
    digits = 0,
    mark = ","
  ) %>%
  formatRound(
    columns = c('Esperanza vida', 'Acceso electricidad', 'Area boscosa',
               'Suscripciones movil', 'Crecimiento PIB', 'Inversion extranjera', 
               'Gasto salud', 'Uso internet', 'Importaciones', 'Exportaciones', 
               'Tierra cultivable', 'Crecimiento poblacion', 'Industria', 'Remesas'), 
    digits = 2
  ) %>%
  formatRound(
    columns = 'Mortalidad infantil',
    digits = 1
  ) %>%
  formatStyle(
    columns = names(Base_2022),
    fontSize = '12px',
    fontFamily = 'Arial, sans-serif'
  ) %>%
  formatStyle(
    columns = names(Base_2022),
    target = 'cell',
    fontWeight = 'bold'
  )  


tabla_inicial

2.4 Descripción del modelo

La implementación del análisis se estructura en cuatro etapas secuenciales, cada una construida sobre los resultados de la anterior, garantizando que la información y patrones descubiertos se preserven y amplifiquen a través del pipeline de análisis.

2.4.1 Preparación y Estandarización de Datos

Previo a cualquier análisis multivariado, es fundamental estandarizar las variables originales para garantizar que todas contribuyan en igualdad de condiciones al cálculo de componentes principales (KeepCoding, 2025). La estandarización se realizó mediante la transformación z-score: \(Z_i = \frac{X_i - \mu_i}{\sigma_i}\) donde \(Z_i\) es la variable estandarizada, \(X_i\) la variable original, \(\mu_i\) la media y \(\sigma_i\) la desviación estándar.

Esta estandarización es crítica porque el análisis de componentes principales se fundamenta en la varianza de los datos: sin estandarizar, variables con escalas numéricas mayores (como población total en millones) dominarían el cálculo de componentes, distorsionando la interpretación y otorgando influencia desproporcionada a magnitudes en lugar de patrones (LinkedIn, 2023; Ciencia de Datos, 2016). Adicionalmente, la estandarización garantiza que el análisis capture relaciones entre variables y no simplemente diferencias en escala.

2.4.2 Análisis de Componentes Principales (ACP)

Con las 17 variables estandarizadas, se aplica el Análisis de Componentes Principales para transformar el conjunto de variables originales, potencialmente correlacionadas, en un conjunto menor de componentes principales ortogonales (Jolliffe, 2002; OpenWebinars, 2025). El ACP identifica las direcciones en el espacio de datos donde la varianza es máxima, creando nuevas dimensiones (componentes) que son combinaciones lineales ponderadas de las variables originales (Jolliffe, 2002; KeepCoding, 2025).

Matemáticamente, el ACP comienza construyendo la matriz de covarianza \(C\) de las variables estandarizadas, cuyas entradas representan cómo varían conjuntamente pares de variables (KeepCoding, 2025). Los vectores propios de esta matriz de covarianza definen las direcciones principales (componentes), ordenados según sus correspondientes valores propios, que representan la cantidad de varianza explicada en cada dirección (Jolliffe, 2002). El primer componente principal captura la máxima varianza; el segundo, la máxima varianza restante sujeto a ortogonalidad respecto al primero; y así sucesivamente (Jolliffe, 2002).

El criterio para determinar el número óptimo de componentes se basó en el principio de parsimonia, buscando maximizar la reducción dimensional manteniendo una representación significativa de la estructura original de los datos.

2.4.3 Cálculo de Distancias Euclidianas

Una vez obtenidos los componentes principales, se utiliza la distancia euclidiana como métrica de disimilaridad entre países. Para cada par de países, la distancia euclidiana se calcula como:

\[ d_{ij} = \sqrt{\sum_{k=1}^{p} (PC_{ik} - PC_{jk})^2} \] Donde:

  • \(d_{ij}\) = Distancia euclidiana entre los países \(i\) y \(j\)
  • \(p\) = Número de componentes principales utilizados
  • \(PC_{ik}\) = Valor del \(k\)-ésimo componente principal para el país \(i\)
  • \(PC_{jk}\) = Valor del \(k\)-ésimo componente principal para el país \(j\)

Esta distancia mide la proximidad multidimensional entre países: distancias pequeñas indican perfiles similares, distancias grandes indican disimilaridad (Universidad de Granada, 2016; ArcGIS, 2024).

La distancia euclidiana es particularmente apropiada para el método de Ward porque, en su implementación aglomerativa, se utiliza el cuadrado de la distancia euclidiana—formalmente conocida como “distancia euclidiana semicuadrada”—como medida de disimilaridad (Ward, 1963; Wikipedia, 2013; TIBCO, 2024).

2.4.4 Clusterización Jerárquica Aglomerativa con Método de Ward

Tras la reducción dimensional mediante Análisis de Componentes Principales, se aplicó una clusterización jerárquica aglomerativa mediante el método de Ward sobre las coordenadas de los países en el espacio reducido de k componentes principales. Esta estrategia metodológica aplicar clustering sobre componentes principales en lugar de variables originales estándar en análisis multivariado porque ofrece ventajas técnicas significativas: elimina multicolinealidad entre variables, asegurando que cada componente captura variabilidad independiente; reduce ruido estadístico al descartar componentes posteriores que explican varianza residual mínima; mejora la estabilidad numérica del algoritmo de clustering al trabajar con matrices de dimensionalidad reducida.

El método de Ward es un algoritmo jerárquico aglomerativo que opera iterativamente sobre el conjunto de observaciones para formar una jerarquía de clusters. El procedimiento inicia considerando cada país como un cluster individual independiente, creando aproximadamente 180 grupos iniciales. En cada iteración subsecuente, el algoritmo identifica el par de clusters más próximos y los fusiona en un único cluster más grande.

El método de Ward minimiza específicamente la suma total de cuadrados dentro de los clusters (WCSS). Formalmente, en cada paso Ward selecciona el par de clusters cuya fusión produce el incremento mínimo en la varianza total intra-cluster. El algoritmo se ejecuta recursivamente hasta que todos los países quedan englobados en un único cluster jerárquico global.

El resultado del método de Ward es un dendrograma—diagrama en forma de árbol invertido—que visualiza el proceso completo de fusión jerárquica. En el dendrograma, el eje horizontal representa la serie de países como hojas basales del árbol, el eje vertical representa la altura de fusión medida en unidades de distancia de Ward, las ramas internas conectan países o sub-clusters que se fusionan, y la altura de cada nodo indica el nivel de disimilaridad en el cual ocurrió esa fusión específica.

2.4.5 Prediccion

Con el objetivo de validar la robustez del modelo de clusterización y demostrar su capacidad predictiva, se procedió a proyectar cinco países adicionales no incluidos en el conjunto de entrenamiento original sobre el espacio factorial de componentes principales. Estos países fueron: Luxemburgo, Uruguay, Belice, Jordania y Angola. La proyección de nuevas observaciones sobre el espacio factorial permite evaluar cómo cada país se posiciona relativamente respecto a los clusters identificados, prediciendo su asignación más probable basada en similitud multidimensional (Hastie et al., 2009; Jolliffe, 2002).

3 Analisis descriptivo de los indicadores

4 Resultados del modelo

4.1 Analisis de componentes principales (ACP)

4.1.1 Matriz de correlaciones

Antes de aplicar el Análisis de Componentes Principales, es fundamental examinar la estructura de correlaciones entre las 17 variables para identificar redundancias potenciales y validar la pertinencia de la reducción de dimensionalidad. La matriz de correlación de Pearson revela las asociaciones lineales entre pares de variables, proporcionando una visión exploratoria de cómo las dimensiones del desarrollo se interrelacionan. (Jolliffe, 2002).

library(tidyverse)     
library(FactoClass)    
library(ade4)          
library(factoextra)    
library(cluster)       
library(dendextend)    
library(ggrepel)      
library(kableExtra)    
library(ggforce)    
library(dendextend)
library(plotly)        
library(sf)            
library(leaflet)       
library(rnaturalearth)
library(RColorBrewer)  
library(ellipse)

datos_analisis <- Base_2022 %>%
  select(-Codigo) %>%
  column_to_rownames("Pais")

library(ggcorrplot)

matriz_cor <- cor(datos_analisis, use = "complete.obs")

# Nombres completos para mejor legibilidad
nombres_completos <- c(
  "PIB_per" = "PIB per cápita",
  "Poblacion" = "Población total",
  "Esperanza vida" = "Esperanza de vida",
  "Acceso electricidad" = "Acceso electricidad",
  "Area boscosa" = "Área boscosa",
  "Suscripciones movil" = "Suscripciones móviles",
  "Crecimiento PIB" = "Crecimiento PIB",
  "Mortalidad infantil" = "Mortalidad infantil",
  "Inversion extranjera" = "Inversión extranjera",
  "Gasto salud" = "Gasto en salud",
  "Uso internet" = "Uso de internet",
  "Importaciones" = "Importaciones",
  "Exportaciones" = "Exportaciones",
  "Tierra cultivable" = "Tierra cultivable",
  "Crecimiento poblacion" = "Crecimiento población",
  "Industria" = "Industria",
  "Remesas" = "Remesas"
)

# Aplicar nombres completos
rownames(matriz_cor) <- nombres_completos[rownames(matriz_cor)]
colnames(matriz_cor) <- nombres_completos[colnames(matriz_cor)]

# Crear heatmap interactivo
heatmap_interactivo <- plot_ly(
  x = colnames(matriz_cor),
  y = rownames(matriz_cor),
  z = matriz_cor,
  type = "heatmap",
  colors = colorRamp(c("#6D9EC1", "white", "#E46726")),
  hoverinfo = "text",
  text = matrix(
    paste(
      "Variable X:", rep(colnames(matriz_cor), each = nrow(matriz_cor)),
      "<br>Variable Y:", rep(rownames(matriz_cor), times = ncol(matriz_cor)),
      "<br>Correlación:", round(c(matriz_cor), 3)
    ),
    nrow = nrow(matriz_cor),
    ncol = ncol(matriz_cor)
  ),
  colorbar = list(
    title = "Correlación",
    titleside = "right"
  )
) %>%
  layout(
    title = list(
      text = "<b>Matriz de Correlaciones Interactiva - 17 Variables de Desarrollo</b>",
      x = 0.05,
      font = list(size = 16)
    ),
    xaxis = list(
      title = "",
      tickangle = -45,
      tickfont = list(size = 10),
      showgrid = FALSE
    ),
    yaxis = list(
      title = "",
      tickfont = list(size = 10),
      showgrid = FALSE
    ),
    margin = list(l = 150, r = 50, b = 150, t = 80),
    annotations = list(
      list(
        x = 0.5,
        y = -0.15,
        text = "Haz clic y arrastra para zoom • Pasa el cursor para ver valores",
        showarrow = FALSE,
        xref = "paper",
        yref = "paper",
        font = list(size = 10, color = "gray")
      )
    )
  )

heatmap_interactivo
matriz_cor <- cor(datos_analisis, use = "complete.obs")

matriz_cor_long <- matriz_cor %>%
  as.data.frame() %>%
  rownames_to_column("Variable1") %>%
  pivot_longer(
    cols = -Variable1,
    names_to = "Variable2",
    values_to = "Correlacion"
  ) %>%
  filter(Variable1 != Variable2) %>%
  mutate(Correlacion = round(Correlacion, 3))

nombres_abreviados <- c(
  "PIB_per" = "PIB pc",
  "Poblacion" = "Población",
  "Esperanza vida" = "Esp. vida",
  "Acceso electricidad" = "Electricidad",
  "Area boscosa" = "Bosques",
  "Suscripciones movil" = "Móvil",
  "Crecimiento PIB" = "Crec. PIB",
  "Mortalidad infantil" = "Mort. inf.",
  "Inversion extranjera" = "IED",
  "Gasto salud" = "Salud",
  "Uso internet" = "Internet",
  "Importaciones" = "Import.",
  "Exportaciones" = "Export.",
  "Tierra cultivable" = "Cultivable",
  "Crecimiento poblacion" = "Crec. pob.",
  "Industria" = "Industria",
  "Remesas" = "Remesas"
)

cor_significativas <- matriz_cor_long %>%
  mutate(
    Variable1_abr = nombres_abreviados[Variable1],
    Variable2_abr = nombres_abreviados[Variable2]
  ) %>%
  filter(abs(Correlacion) > 0.5) %>%
  arrange(desc(abs(Correlacion))) %>%
  select(Variable1_abr, Variable2_abr, Correlacion) %>%
  distinct()

tabla_cor <- cor_significativas %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 12**"),
    subtitle = "Matriz de Correlaciones - Correlaciones Significativas (|r| > 0.5)"
  ) %>%
  cols_label(
    Variable1_abr = md("**Variable 1**"),
    Variable2_abr = md("**Variable 2**"),
    Correlacion = md("**Correlación (r)**")
  ) %>%
  cols_align(
    align = "center",
    columns = everything()
  ) %>%
  fmt_number(
    columns = Correlacion,
    decimals = 3
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Variable1_abr, Variable2_abr))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = c(Variable1_abr, Variable2_abr))
  ) %>%
  tab_style(
    style = cell_fill(color = "#E8F5E8"),
    locations = cells_body(
      rows = Correlacion > 0.7
    )
  ) %>%
  tab_style(
    style = cell_fill(color = "#FFE6E6"),
    locations = cells_body(
      rows = Correlacion < -0.7
    )
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(80),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(6),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en World Bank (2023)")
  ) %>%
  tab_footnote(
    footnote = "Correlaciones positivas fuertes (r > 0.7) en verde claro",
    locations = cells_body(
      rows = 1
    )
  ) %>%
  tab_footnote(
    footnote = "Correlaciones negativas fuertes (r < -0.7) en rojo claro",
    locations = cells_body(
      rows = nrow(cor_significativas)
    )
  )

tabla_cor
Tabla 12
Matriz de Correlaciones - Correlaciones Significativas (|r| > 0.5)
Variable 1 Variable 2 Correlación (r)
Esp. vida1 Mort. inf.1 −0.9041
Mort. inf. Esp. vida −0.904
Import. Export. 0.831
Export. Import. 0.831
Mort. inf. Internet −0.829
Internet Mort. inf. −0.829
Esp. vida Internet 0.823
Electricidad Internet 0.823
Internet Esp. vida 0.823
Internet Electricidad 0.823
Electricidad Mort. inf. −0.801
Mort. inf. Electricidad −0.801
Esp. vida Electricidad 0.761
Electricidad Esp. vida 0.761
PIB pc Esp. vida 0.685
Esp. vida PIB pc 0.685
PIB pc Internet 0.599
Internet PIB pc 0.599
PIB pc Mort. inf. −0.534
Mort. inf. PIB pc −0.534
Móvil Internet 0.511
Internet Móvil 0.511
Electricidad Crec. pob. −0.505
Crec. pob.2 Electricidad2 −0.5052
1 Correlaciones positivas fuertes (r > 0.7) en verde claro
2 Correlaciones negativas fuertes (r < -0.7) en rojo claro
Fuentes: Elaboración propia con base en World Bank (2023)

La matriz de correlación entre todas las variables de desarrollo es fundamental porque exhibe patrones predecibles: variables económicas tienden a correlacionarse positivamente entre sí (PIB per cápita, crecimiento del PIB, inversión extranjera), variables de bienestar social correlacionan positivamente (esperanza de vida, acceso a electricidad, uso de internet), y existe una correlación positiva sustancial entre estas dos dimensiones generales (Hastie et al., 2009). Adicionalmente, se observan correlaciones negativas entre indicadores de rezago (mortalidad infantil, tierra cultivable) y variables de desarrollo avanzado, reflejando que países con mayor riqueza y bienestar exhiben menores tasas de mortalidad y menor dependencia agrícola. La presencia de correlaciones altas (superiores a 0.7) entre múltiples pares de variables justifica plenamente la aplicación del ACP: la reducción dimensional elimina redundancia sin perder información esencial (Jolliffe, 2002; Hastie et al., 2009).

4.1.2 ACP

El Análisis de Componentes Principales fue aplicado al conjunto de 17 variables estandarizadas para identificar las dimensiones latentes subyacentes de variabilidad en el desarrollo internacional. El procedimiento consiste en la descomposición espectral de la matriz de covarianza estandarizada, identificando vectores propios (componentes) ordenados según sus valores propios (autovalores) en orden descendente. Cada componente principal es una combinación lineal ortogonal de las variables originales, diseñada para capturar la máxima varianza posible de manera sucesiva (Jolliffe, 2002; Hastie et al., 2009).

acp_temp <- dudi.pca(datos_analisis, center = TRUE, scale = TRUE, scannf = FALSE, nf = ncol(datos_analisis))

varianza_acum <- cumsum(acp_temp$eig) / sum(acp_temp$eig) * 100

n_componentes <- which(varianza_acum >= 70)[1]

acp_resultado <- dudi.pca(
  df = datos_analisis,
  center = TRUE,
  scale = TRUE,
  scannf = FALSE,
  nf = n_componentes
)

factores <- acp_resultado$li
varianza_df <- data.frame(
  Componente = factor(1:length(acp_resultado$eig)),
  Varianza = acp_resultado$eig / sum(acp_resultado$eig) * 100,
  VarianzaAcum = varianza_acum
) %>%  gt() %>%
  tab_header(
    title = md("**Tabla 5**"),
    subtitle = "Varianza Explicada por Componentes Principales"
  ) %>%
  cols_label(
    Componente = md("**Componente**"),
    Varianza = md("**Varianza (%)**"),
    VarianzaAcum = md("**Varianza Acumulada (%)**")
  ) %>%
  cols_align(
    align = "left",
    columns = everything()
  ) %>%
  fmt_number(
    columns = c(Varianza, VarianzaAcum),
    decimals = 2
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", size = "medium"),
      cell_fill(color = "white")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(
      sides = c("top", "bottom"),
      color = "black",
      weight = px(1)
    ),
    locations = list(
      cells_column_labels(),
      cells_body()
    )
  ) %>%
  tab_style(
    style = cell_borders(
      sides = "right",
      color = "gray80",
      weight = px(1)
    ),
    locations = cells_body(columns = c(Componente, Varianza))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Componente)
  ) %>%
  tab_style(
    style = cell_text(size = "small"),
    locations = cells_body(columns = c(Varianza, VarianzaAcum))
  ) %>%
  tab_options(
    table.font.names = "Times New Roman",
    table.width = pct(100),
    table.border.top.style = "none",
    table.border.bottom.style = "none",
    column_labels.border.top.style = "none",
    column_labels.border.bottom.width = px(2),
    column_labels.border.bottom.color = "black",
    table_body.border.bottom.style = "none",
    table_body.border.top.style = "none",
    data_row.padding = px(8),
    heading.title.font.size = 14,
    heading.subtitle.font.size = 12,
    heading.padding = px(4),
    footnotes.padding = px(4)
  ) %>%
  tab_source_note(
    source_note = md("**Fuentes:** Elaboración propia con base en los resultados del ACP")
  ) %>%
  tab_footnote(
    footnote = "Porcentaje de varianza explicada individualmente por cada componente principal",
    locations = cells_body(
      rows = 1,
      columns = Varianza
    )
  ) %>%
  tab_footnote(
    footnote = "Porcentaje acumulado de varianza explicada por los componentes hasta el actual",
    locations = cells_body(
      rows = 1,
      columns = VarianzaAcum
    )
  ) %>%
  tab_footnote(
    footnote = "Los componentes principales se ordenan de mayor a menor varianza explicada",
    locations = cells_title(groups = "subtitle")
  )

varianza_df 
Tabla 5
Varianza Explicada por Componentes Principales1
Componente Varianza (%) Varianza Acumulada (%)
1 29.062 29.063
2 12.17 41.22
3 11.13 52.36
4 7.83 60.19
5 6.96 67.15
6 6.42 73.57
7 5.69 79.26
8 5.14 84.39
9 4.55 88.94
10 3.13 92.07
11 2.62 94.69
12 1.84 96.53
13 1.27 97.81
14 0.99 98.80
15 0.63 99.43
16 0.35 99.78
17 0.22 100.00
1 Los componentes principales se ordenan de mayor a menor varianza explicada
2 Porcentaje de varianza explicada individualmente por cada componente principal
3 Porcentaje acumulado de varianza explicada por los componentes hasta el actual
Fuentes: Elaboración propia con base en los resultados del ACP
varianza_df <- data.frame(
  Componente = paste0("PC", 1:length(acp_resultado$eig)),
  Varianza = acp_resultado$eig / sum(acp_resultado$eig) * 100,
  VarianzaAcum = varianza_acum
)

pc1_var <- round(varianza_df$Varianza[1], 1)
pc2_var <- round(varianza_df$Varianza[2], 1)
pc3_var <- round(varianza_df$Varianza[3], 1)
pc4_var <- round(varianza_df$Varianza[4], 1)
pc5_var <- round(varianza_df$Varianza[5], 1)
pc6_var <- round(varianza_df$Varianza[6], 1)

pc1_acum <- round(varianza_df$VarianzaAcum[1], 1)
pc2_acum <- round(varianza_df$VarianzaAcum[2], 1)
pc3_acum <- round(varianza_df$VarianzaAcum[3], 1)
pc4_acum <- round(varianza_df$VarianzaAcum[4], 1)
pc5_acum <- round(varianza_df$VarianzaAcum[5], 1)
pc6_acum <- round(varianza_df$VarianzaAcum[6], 1)

En este análisis, el primer componente (PC1) capturó un 29.1% de la varianza total, lo que indica que existe una dimensión principal que diferencia fundamentalmente a los países. Los componentes posteriores capturan variabilidad subsidiaria: el segundo componente (PC2) explica 12.2% (acumulando 41.2%), el tercero (PC3) 11.1% (acumulando 52.4%), el cuarto (PC4) 7.8% (acumulando 60.2%).

4.1.3 Grafico de sedimentacion

El gráfico de sedimentación visualiza el concepto del “codo” (elbow) introducido por Kaiser (1960). La curva de los eigenvalores (representada como barras) exhibe un descenso pronunciado en los primeros componentes, indicando que capturan varianza sustancial. A partir de cierto componente, la pendiente se aplana significativamente, entrando en un régimen donde componentes posteriores explican proporciones cada vez menores de varianza residual (Hastie et al., 2009).

res.pca <- prcomp(datos_analisis, scale = TRUE)


eig.val <- get_eigenvalue(res.pca)
fviz_eig(res.pca,
         addlabels = TRUE,
         ylim = c(0, max(get_eigenvalue(res.pca)[, 2]) + 5),
         choice = "variance") +
  labs(
    title = "Varianza Explicada por Componente Principal",
    subtitle = "Autovalores del análisis de componentes principales",
    x = "Componentes Principales",
    y = "Porcentaje de Varianza Explicada (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5, color = "#2C5F8D"),
    plot.subtitle = element_text(size = 11, hjust = 0.5, color = "gray40"),
    axis.title = element_text(face = "bold", size = 12, color = "#2C5F8D"),
    axis.text = element_text(size = 10, color = "gray30"),
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "gray92", size = 0.3),
    panel.background = element_rect(fill = "white"),
    plot.background = element_rect(fill = "white")
  ) +
  scale_fill_manual(values = "#2C5F8D") +
  scale_color_manual(values = "#2C5F8D")

El punto donde esta curvatura cambia de pronunciada a plana (el “codo”) indica aproximadamente el número de componentes que retienen información relevante; componentes posteriores al codo tienden a capturar principalmente ruido estadístico (Jolliffe, 2002). En este análisis, la línea verde punteada marca el umbral del 70%, y la intersección de la línea morada acumulada con este umbral define el número final de componentes 6 que será utilizado para la clusterización posterior.

4.1.4 Contribución de Variables a Componentes Principales

La comprensión de cómo cada variable original contribuye a la definición de los componentes principales es esencial para interpretar las dimensiones latentes descubiertas. La contribución de una variable a un componente cuantifica el grado en el cual esa variable particular “explica” o “define” la dirección de ese componente en el espacio multidimensional original. Matemáticamente, la contribución se expresa como porcentaje de la varianza del componente que puede atribuirse a cada variable (Hastie et al., 2009; Jolliffe, 2002).

Adicionalmente, la calidad de representación (cos²) de una variable en un componente indica qué proporción de la variabilidad total de esa variable es capturada por el componente. Un cos² cercano a 1 significa que la variable está casi completamente explicada por ese componente; un cos² cercano a 0 significa que la variable requiere componentes posteriores para ser bien representada (Jolliffe, 2002). Estas dos medidas—contribución y \(cos^2\)—son complementarias: la primera explica la importancia relativa de una variable en definir un componente; la segunda explica qué tan bien ese componente explica la variable (Hastie et al., 2009).

contribuciones <- as.data.frame(acp_resultado$co)
contribuciones$Variable <- rownames(contribuciones)

cos2_df <- as.data.frame(acp_resultado$co^2)
cos2_df$Variable <- rownames(cos2_df)

crear_tabla_contribucion <- function(componente_num, contrib_df, cos2_df, titulo, tabla_num) {
  comp_data <- contrib_df %>%
    select(Variable, paste0("Comp", componente_num)) %>%
    rename(Loading = paste0("Comp", componente_num))
  
  cos2_data <- cos2_df %>%
    select(Variable, paste0("Comp", componente_num)) %>%
    rename(Cos2 = paste0("Comp", componente_num))
  
  comp_data <- comp_data %>%
    left_join(cos2_data, by = "Variable") %>%
    mutate(LoadingAbs = abs(Loading)) %>%
    arrange(desc(LoadingAbs)) %>%
    select(-LoadingAbs) %>%
    mutate(
      Loading = round(Loading, 4),
      Cos2 = round(Cos2, 4)
    )
  
  descripciones <- c(
    "PIB_per" = "PIB per cápita (US$)",
    "Poblacion" = "Población total",
    "Esperanza vida" = "Esperanza de vida al nacer (años)",
    "Acceso electricidad" = "Acceso a electricidad (% población)",
    "Area boscosa" = "Área boscosa (% territorio)",
    "Suscripciones movil" = "Suscripciones móviles (cada 100 hab.)",
    "Crecimiento PIB" = "Crecimiento del PIB (% anual)",
    "Mortalidad infantil" = "Mortalidad infantil (cada 1,000 nac.)",
    "Inversion extranjera" = "Inversión extranjera (% PIB)",
    "Gasto salud" = "Gasto en salud (% PIB)",
    "Uso internet" = "Uso de internet (% población)",
    "Importaciones" = "Importaciones (% PIB)",
    "Exportaciones" = "Exportaciones (% PIB)",
    "Tierra cultivable" = "Tierra cultivable (% territorio)",
    "Crecimiento poblacion" = "Crecimiento poblacional (% anual)",
    "Industria" = "Industria (% PIB)",
    "Remesas" = "Remesas recibidas (% PIB)"
  )
  
  comp_data <- comp_data %>%
    mutate(
      Descripcion = descripciones[Variable],
      Interpretacion = paste0(
        "Loading: ", Loading, 
        " | Cos²: ", Cos2,
        case_when(
          abs(Loading) >= 0.3 ~ " (Contribución muy fuerte)",
          abs(Loading) >= 0.2 ~ " (Contribución fuerte)", 
          abs(Loading) >= 0.1 ~ " (Contribución moderada)",
          abs(Loading) >= 0.05 ~ " (Contribución débil)",
          TRUE ~ " (Contribución muy débil)"
        )
      )
    ) %>%
    select(Variable, Descripcion, Interpretacion)
  
  tabla <- comp_data %>%
    gt() %>%
    tab_header(
      title = md(paste0("**Tabla ", tabla_num, "**")),
      subtitle = titulo
    ) %>%
    cols_label(
      Variable = md("**Variable**"),
      Descripcion = md("**Descripción**"),
      Interpretacion = md("**Interpretación**")
    ) %>%
    cols_align(
      align = "left",
      columns = everything()
    ) %>%
    tab_style(
      style = list(
        cell_text(weight = "bold", size = "medium"),
        cell_fill(color = "white")
      ),
      locations = cells_column_labels()
    ) %>%
    tab_style(
      style = cell_borders(
        sides = c("top", "bottom"),
        color = "black",
        weight = px(1)
      ),
      locations = list(
        cells_column_labels(),
        cells_body()
      )
    ) %>%
    tab_style(
      style = cell_borders(
        sides = "right",
        color = "gray80",
        weight = px(1)
      ),
      locations = cells_body(columns = c(Variable, Descripcion))
    ) %>%
    tab_style(
      style = cell_text(weight = "bold"),
      locations = cells_body(columns = Variable)
    ) %>%
    tab_style(
      style = cell_text(size = "small"),
      locations = cells_body(columns = c(Descripcion, Interpretacion))
    ) %>%
    tab_options(
      table.font.names = "Times New Roman",
      table.width = pct(100),
      table.border.top.style = "none",
      table.border.bottom.style = "none",
      column_labels.border.top.style = "none",
      column_labels.border.bottom.width = px(2),
      column_labels.border.bottom.color = "black",
      table_body.border.bottom.style = "none",
      table_body.border.top.style = "none",
      data_row.padding = px(8),
      heading.title.font.size = 14,
      heading.subtitle.font.size = 12,
      heading.padding = px(4),
      footnotes.padding = px(4)
    ) %>%
    tab_source_note(
      source_note = md("**Fuentes:** Elaboración propia con base en los resultados del ACP")
    ) %>%
    tab_footnote(
      footnote = "Loading: contribución de la variable al componente (valores absolutos >0.3 indican contribución fuerte)",
      locations = cells_title(groups = "subtitle")
    ) %>%
    tab_footnote(
      footnote = "Cos²: calidad de representación de la variable en el componente (valores cercanos a 1 indican mejor representación)",
      locations = cells_body(
        rows = 1,
        columns = Interpretacion
      )
    )
  
  return(tabla)
}


tabla_pc1 <- crear_tabla_contribucion(1, contribuciones, cos2_df,
                                     "Contribución de Variables al Componente Principal 1 (24.3% de varianza)",
                                     6)
tabla_pc2 <- crear_tabla_contribucion(2, contribuciones, cos2_df,
                                     "Contribución de Variables al Componente Principal 2 (13.5% de varianza)", 
                                     7)
tabla_pc3 <- crear_tabla_contribucion(3, contribuciones, cos2_df,
                                     "Contribución de Variables al Componente Principal 3 (9.1% de varianza)",
                                     8)
tabla_pc4 <- crear_tabla_contribucion(4, contribuciones, cos2_df,
                                     "Contribución de Variables al Componente Principal 4 (7.5% de varianza)",
                                     9)

tabla_pc1
Tabla 6
Contribución de Variables al Componente Principal 1 (24.3% de varianza)1
Variable Descripción Interpretación
Esperanza vida Esperanza de vida al nacer (años) Loading: 0.9179 | Cos²: 0.8426 (Contribución muy fuerte)2
Uso internet Uso de internet (% población) Loading: 0.917 | Cos²: 0.8408 (Contribución muy fuerte)
Mortalidad infantil Mortalidad infantil (cada 1,000 nac.) Loading: -0.9074 | Cos²: 0.8233 (Contribución muy fuerte)
Acceso electricidad Acceso a electricidad (% población) Loading: 0.8242 | Cos²: 0.6793 (Contribución muy fuerte)
PIB_per PIB per cápita (US$) Loading: 0.6677 | Cos²: 0.4459 (Contribución muy fuerte)
Exportaciones Exportaciones (% PIB) Loading: 0.5441 | Cos²: 0.296 (Contribución muy fuerte)
Suscripciones movil Suscripciones móviles (cada 100 hab.) Loading: 0.5353 | Cos²: 0.2865 (Contribución muy fuerte)
Crecimiento poblacion Crecimiento poblacional (% anual) Loading: -0.498 | Cos²: 0.248 (Contribución muy fuerte)
Gasto salud Gasto en salud (% PIB) Loading: 0.4846 | Cos²: 0.2348 (Contribución muy fuerte)
Importaciones Importaciones (% PIB) Loading: 0.3854 | Cos²: 0.1485 (Contribución muy fuerte)
Remesas Remesas recibidas (% PIB) Loading: -0.243 | Cos²: 0.0591 (Contribución fuerte)
Inversion extranjera Inversión extranjera (% PIB) Loading: 0.1527 | Cos²: 0.0233 (Contribución moderada)
Area boscosa Área boscosa (% territorio) Loading: 0.0743 | Cos²: 0.0055 (Contribución débil)
Poblacion Población total Loading: -0.0505 | Cos²: 0.0026 (Contribución débil)
Tierra cultivable Tierra cultivable (% territorio) Loading: -0.0425 | Cos²: 0.0018 (Contribución muy débil)
Crecimiento PIB Crecimiento del PIB (% anual) Loading: -0.0299 | Cos²: 9e-04 (Contribución muy débil)
Industria Industria (% PIB) Loading: 0.0216 | Cos²: 5e-04 (Contribución muy débil)
1 Loading: contribución de la variable al componente (valores absolutos >0.3 indican contribución fuerte)
2 Cos²: calidad de representación de la variable en el componente (valores cercanos a 1 indican mejor representación)
Fuentes: Elaboración propia con base en los resultados del ACP
tabla_pc2
Tabla 7
Contribución de Variables al Componente Principal 2 (13.5% de varianza)1
Variable Descripción Interpretación
Industria Industria (% PIB) Loading: -0.74 | Cos²: 0.5476 (Contribución muy fuerte)2
Crecimiento poblacion Crecimiento poblacional (% anual) Loading: -0.6278 | Cos²: 0.3941 (Contribución muy fuerte)
Remesas Remesas recibidas (% PIB) Loading: 0.4983 | Cos²: 0.2483 (Contribución muy fuerte)
Gasto salud Gasto en salud (% PIB) Loading: 0.4369 | Cos²: 0.1909 (Contribución muy fuerte)
Importaciones Importaciones (% PIB) Loading: 0.4088 | Cos²: 0.1671 (Contribución muy fuerte)
Tierra cultivable Tierra cultivable (% territorio) Loading: 0.3472 | Cos²: 0.1206 (Contribución muy fuerte)
Crecimiento PIB Crecimiento del PIB (% anual) Loading: -0.3354 | Cos²: 0.1125 (Contribución muy fuerte)
PIB_per PIB per cápita (US$) Loading: -0.2815 | Cos²: 0.0792 (Contribución fuerte)
Suscripciones movil Suscripciones móviles (cada 100 hab.) Loading: -0.2746 | Cos²: 0.0754 (Contribución fuerte)
Area boscosa Área boscosa (% territorio) Loading: 0.2634 | Cos²: 0.0694 (Contribución fuerte)
Uso internet Uso de internet (% población) Loading: -0.1677 | Cos²: 0.0281 (Contribución moderada)
Poblacion Población total Loading: -0.1308 | Cos²: 0.0171 (Contribución moderada)
Esperanza vida Esperanza de vida al nacer (años) Loading: -0.107 | Cos²: 0.0115 (Contribución moderada)
Inversion extranjera Inversión extranjera (% PIB) Loading: 0.0791 | Cos²: 0.0063 (Contribución débil)
Acceso electricidad Acceso a electricidad (% población) Loading: 0.0132 | Cos²: 2e-04 (Contribución muy débil)
Exportaciones Exportaciones (% PIB) Loading: -0.0125 | Cos²: 2e-04 (Contribución muy débil)
Mortalidad infantil Mortalidad infantil (cada 1,000 nac.) Loading: -0.005 | Cos²: 0 (Contribución muy débil)
1 Loading: contribución de la variable al componente (valores absolutos >0.3 indican contribución fuerte)
2 Cos²: calidad de representación de la variable en el componente (valores cercanos a 1 indican mejor representación)
Fuentes: Elaboración propia con base en los resultados del ACP
tabla_pc3
Tabla 8
Contribución de Variables al Componente Principal 3 (9.1% de varianza)1
Variable Descripción Interpretación
Importaciones Importaciones (% PIB) Loading: -0.7136 | Cos²: 0.5092 (Contribución muy fuerte)2
Exportaciones Exportaciones (% PIB) Loading: -0.6994 | Cos²: 0.4892 (Contribución muy fuerte)
Inversion extranjera Inversión extranjera (% PIB) Loading: -0.511 | Cos²: 0.2611 (Contribución muy fuerte)
Area boscosa Área boscosa (% territorio) Loading: 0.3756 | Cos²: 0.1411 (Contribución muy fuerte)
Poblacion Población total Loading: 0.3618 | Cos²: 0.1309 (Contribución muy fuerte)
Crecimiento PIB Crecimiento del PIB (% anual) Loading: -0.3525 | Cos²: 0.1243 (Contribución muy fuerte)
Acceso electricidad Acceso a electricidad (% población) Loading: 0.2684 | Cos²: 0.072 (Contribución fuerte)
Crecimiento poblacion Crecimiento poblacional (% anual) Loading: -0.2573 | Cos²: 0.0662 (Contribución fuerte)
Mortalidad infantil Mortalidad infantil (cada 1,000 nac.) Loading: -0.1741 | Cos²: 0.0303 (Contribución moderada)
Gasto salud Gasto en salud (% PIB) Loading: 0.1346 | Cos²: 0.0181 (Contribución moderada)
Suscripciones movil Suscripciones móviles (cada 100 hab.) Loading: 0.1258 | Cos²: 0.0158 (Contribución moderada)
Esperanza vida Esperanza de vida al nacer (años) Loading: 0.0909 | Cos²: 0.0083 (Contribución débil)
Remesas Remesas recibidas (% PIB) Loading: 0.0907 | Cos²: 0.0082 (Contribución débil)
Industria Industria (% PIB) Loading: 0.0873 | Cos²: 0.0076 (Contribución débil)
PIB_per PIB per cápita (US$) Loading: -0.0682 | Cos²: 0.0046 (Contribución débil)
Uso internet Uso de internet (% población) Loading: 0.0585 | Cos²: 0.0034 (Contribución débil)
Tierra cultivable Tierra cultivable (% territorio) Loading: -0.0486 | Cos²: 0.0024 (Contribución muy débil)
1 Loading: contribución de la variable al componente (valores absolutos >0.3 indican contribución fuerte)
2 Cos²: calidad de representación de la variable en el componente (valores cercanos a 1 indican mejor representación)
Fuentes: Elaboración propia con base en los resultados del ACP
tabla_pc4
Tabla 9
Contribución de Variables al Componente Principal 4 (7.5% de varianza)1
Variable Descripción Interpretación
Tierra cultivable Tierra cultivable (% territorio) Loading: 0.6393 | Cos²: 0.4086 (Contribución muy fuerte)2
Area boscosa Área boscosa (% territorio) Loading: -0.5925 | Cos²: 0.351 (Contribución muy fuerte)
Poblacion Población total Loading: 0.5439 | Cos²: 0.2958 (Contribución muy fuerte)
Crecimiento PIB Crecimiento del PIB (% anual) Loading: 0.3098 | Cos²: 0.096 (Contribución muy fuerte)
Gasto salud Gasto en salud (% PIB) Loading: -0.2058 | Cos²: 0.0423 (Contribución fuerte)
Industria Industria (% PIB) Loading: -0.1835 | Cos²: 0.0337 (Contribución moderada)
Acceso electricidad Acceso a electricidad (% población) Loading: 0.1562 | Cos²: 0.0244 (Contribución moderada)
Exportaciones Exportaciones (% PIB) Loading: -0.134 | Cos²: 0.018 (Contribución moderada)
Inversion extranjera Inversión extranjera (% PIB) Loading: 0.1237 | Cos²: 0.0153 (Contribución moderada)
Importaciones Importaciones (% PIB) Loading: -0.1065 | Cos²: 0.0113 (Contribución moderada)
Esperanza vida Esperanza de vida al nacer (años) Loading: 0.0943 | Cos²: 0.0089 (Contribución débil)
Remesas Remesas recibidas (% PIB) Loading: 0.0913 | Cos²: 0.0083 (Contribución débil)
Crecimiento poblacion Crecimiento poblacional (% anual) Loading: -0.0858 | Cos²: 0.0074 (Contribución débil)
Mortalidad infantil Mortalidad infantil (cada 1,000 nac.) Loading: -0.0728 | Cos²: 0.0053 (Contribución débil)
PIB_per PIB per cápita (US$) Loading: -0.0603 | Cos²: 0.0036 (Contribución débil)
Uso internet Uso de internet (% población) Loading: 0.0321 | Cos²: 0.001 (Contribución muy débil)
Suscripciones movil Suscripciones móviles (cada 100 hab.) Loading: 0.0292 | Cos²: 9e-04 (Contribución muy débil)
1 Loading: contribución de la variable al componente (valores absolutos >0.3 indican contribución fuerte)
2 Cos²: calidad de representación de la variable en el componente (valores cercanos a 1 indican mejor representación)
Fuentes: Elaboración propia con base en los resultados del ACP

4.1.5 Análisis Multivariado: Interpretación de Componentes y Países

Una vez identificados los componentes principales y cuantificadas las contribuciones de cada variable, es fundamental realizar un análisis multivariado que permita interpretar simultáneamente las relaciones entre países y variables en el espacio reducido de componentes principales. Este análisis se fundamenta en visualizaciones bidimensionales que proyectan tanto países (individuos) como variables sobre los planos definidos por pares de componentes principales, revelando patrones de similitud, agrupamientos naturales y características diferenciadoras entre grupos de países (Jolliffe, 2002; Hastie et al., 2009).

ind_data <- get_pca_ind(res.pca)


ind_df <- data.frame(
  Pais = rownames(ind_data$coord),
  Dim1 = ind_data$coord[, 1],
  Dim2 = ind_data$coord[, 2],
  Dim3 = ind_data$coord[, 3],
  Dim4 = ind_data$coord[, 4],
  Contrib1 = ind_data$contrib[, 1],
  Contrib2 = ind_data$contrib[, 2],
  Contrib3 = ind_data$contrib[, 3],
  Contrib4 = ind_data$contrib[, 4],
  Cos2_1 = ind_data$cos2[, 1],
  Cos2_2 = ind_data$cos2[, 2],
  Cos2_3 = ind_data$cos2[, 3],
  Cos2_4 = ind_data$cos2[, 4]
)

p1 <- plot_ly(ind_df,
              x = ~Dim1, 
              y = ~Dim2,
              color = ~Contrib1,
              colors = colorRampPalette(c("#00AFBB", "#E7B800", "#FC4E07"))(100),
              text = ~paste("<b>", Pais, "</b><br>",
                            "Dim 1:", round(Dim1, 3), "<br>",
                            "Dim 2:", round(Dim2, 3), "<br>",
                            "<b>Contribución Dim 1:</b> ", round(Contrib1, 2), "%<br>",
                            "<b>Contribución Dim 2:</b> ", round(Contrib2, 2), "%<br>",
                            "Cos2 Dim 1:", round(Cos2_1, 3), "<br>",
                            "Cos2 Dim 2:", round(Cos2_2, 3)),
              type = "scatter",
              mode = "markers",
              marker = list(size = 10, opacity = 0.8, line = list(width = 1, color = "white")),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  layout(
    title = list(
      text = "Individuos: Dimensión 1 vs Dimensión 2<br><sub>Coloreado por Contribución Dim 1</sub>",
      font = list(size = 16, color = "#2C5F8D")
    ),
    xaxis = list(title = "Dimensión 1", zeroline = TRUE, zerolinecolor = "gray"),
    yaxis = list(title = "Dimensión 2", zeroline = TRUE, zerolinecolor = "gray"),
    hovermode = "closest",
    plot_bgcolor = "white",
    paper_bgcolor = "white"
  )

p1

Se puede observar que Qatar tiene una contribución alta en la dimension 2, la cual es de 11,66%, es algo esperable sabiendo que el país árabe tiene un gran comercio. Mientras que San Marino contribuye en la dimensión 2 con un 0%, contrariamente de su aporte en la dimensión 1 el cual es 2.86%, lo cual refiere a qué este país, tiene una baja tasa económica mientras que en factores como esperanza de vida es muy fuerte.

Al contrario podemos ver países como Niger el cual tiene un aporte en la dimensión 1 de -5,593% y en la dimensión 2 de -0,867%, lo cual nos da a pensar que este país tiene deficiencia en ambos factores (social/economico)

p2 <- plot_ly(ind_df,
              x = ~Dim3, 
              y = ~Dim4,
              color = ~Contrib3,
              colors = colorRampPalette(c("#00AFBB", "#E7B800", "#FC4E07"))(100),
              text = ~paste("<b>", Pais, "</b><br>",
                            "Dim 3:", round(Dim3, 3), "<br>",
                            "Dim 4:", round(Dim4, 3), "<br>",
                            "<b>Contribución Dim 3:</b> ", round(Contrib3, 2), "%<br>",
                            "<b>Contribución Dim 4:</b> ", round(Contrib4, 2), "%<br>",
                            "Cos2 Dim 3:", round(Cos2_3, 3), "<br>",
                            "Cos2 Dim 4:", round(Cos2_4, 3)),
              type = "scatter",
              mode = "markers",
              marker = list(size = 10, opacity = 0.8, line = list(width = 1, color = "white")),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  layout(
    title = list(
      text = "Individuos: Dimensión 3 vs Dimensión 4<br><sub>Coloreado por Contribución Dim 3</sub>",
      font = list(size = 16, color = "#2C5F8D")
    ),
    xaxis = list(title = "Dimensión 3", zeroline = TRUE, zerolinecolor = "gray"),
    yaxis = list(title = "Dimensión 4", zeroline = TRUE, zerolinecolor = "gray"),
    hovermode = "closest",
    plot_bgcolor = "white",
    paper_bgcolor = "white"
  )

p2

Al observar el grafico podemos identificar algunos datos, casos como la India donde su aporte en la dimensión 4 es de 8,19% lo cual nos demuestra su gran tasa poblacional y de tierra cultivable. Timor-leste tiene un aporte en la dimensión 4 de un 12,88% el cual refiere que tiene poca tendencia de uso de internet y un alta área boscosa. Otro caso a referir Djibouti tiene dos valores importantes en la dimensión 3 tiene un aporte de 8,47% y en la 4 de 0,24%, lo cual refiere que es uno de los paises que menos exporta y más importa.

4.1.6 Representación de Variables en el Plano de Componentes Principales

El círculo de correlaciones es una herramienta fundamental para interpretar las dimensiones latentes capturadas por PC1 y PC2. Cada una de las 17 variables originales se representa como un vector (flecha) proyectado desde el origen hacia el plano bidimensional definido por los dos primeros componentes principales. La longitud de cada flecha indica la calidad de representación de esa variable: flechas largas (próximas al círculo unitario de referencia) indican variables bien representadas en PC1-PC2, mientras que flechas cortas indican que la variable requiere componentes posteriores para ser completamente explicada (Jolliffe, 2002; Hastie et al., 2009).

La dirección de cada flecha—es decir, el ángulo que forma con los ejes PC1 y PC2—indica cómo esa variable se correlaciona con los componentes. Las variables posicionadas en la dirección positiva del eje PC1 (hacia la derecha del gráfico) son aquellas que correlacionan positivamente con PC1 y, por lo tanto, caracterizan el polo derecho del eje.

var_data <- get_pca_var(res.pca)

var_df <- data.frame(
  Variable = rownames(var_data$coord),
  Dim1 = var_data$coord[, 1],
  Dim2 = var_data$coord[, 2],
  Dim3 = var_data$coord[, 3],
  Dim4 = var_data$coord[, 4],
  Dim5 = var_data$coord[, 5],
  Dim6 = var_data$coord[, 6],
  Contrib1 = var_data$contrib[, 1],
  Contrib2 = var_data$contrib[, 2],
  Contrib3 = var_data$contrib[, 3],
  Contrib4 = var_data$contrib[, 4],
  Contrib5 = var_data$contrib[, 5],
  Contrib6 = var_data$contrib[, 6],
  Cos2_1 = var_data$cos2[, 1],
  Cos2_2 = var_data$cos2[, 2],
  Cos2_3 = var_data$cos2[, 3],
  Cos2_4 = var_data$cos2[, 4],
  Cos2_5 = var_data$cos2[, 5],
  Cos2_6 = var_data$cos2[, 6]
)


p1 <- plot_ly(var_df,
              x = ~Dim1, 
              y = ~Dim2,
              color = ~Contrib1,
              colors = colorRampPalette(c("#00AFBB", "#E7B800", "#FC4E07"))(100),
              text = ~paste("<b>", Variable, "</b><br>",
                            "Dim 1:", round(Dim1, 3), "<br>",
                            "Dim 2:", round(Dim2, 3), "<br>",
                            "<b>Contribución Dim 1:</b> ", round(Contrib1, 2), "%<br>",
                            "<b>Contribución Dim 2:</b> ", round(Contrib2, 2), "%<br>",
                            "Cos2 Dim 1:", round(Cos2_1, 3), "<br>",
                            "Cos2 Dim 2:", round(Cos2_2, 3)),
              type = "scatter",
              mode = "markers",
              marker = list(size = 12, opacity = 0.8, line = list(width = 2, color = "white")),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  add_segments(x = 0, xend = ~Dim1, y = 0, yend = ~Dim2,
               line = list(color = "rgba(100, 100, 100, 0.3)", width = 1),
               showlegend = FALSE, hoverinfo = "skip") %>%
  
  layout(
    title = list(
      text = "Variables: Dimensión 1 vs Dimensión 2<br><sub>Coloreado por Contribución Dim 1</sub>",
      font = list(size = 16, color = "#2C5F8D")
    ),
    xaxis = list(title = "Dimensión 1", zeroline = TRUE, zerolinecolor = "gray"),
    yaxis = list(title = "Dimensión 2", zeroline = TRUE, zerolinecolor = "gray"),
    hovermode = "closest",
    plot_bgcolor = "white",
    paper_bgcolor = "white"
  )

p1

Observamos en el gráfico que las variables que más contribuyen a la dimensión 1 son esperanza de vida positivamente (17.03%), uso de internet positivamente (16.88%) y mortalidad infantil negativamente (16.63%) A la dimensión 2 son la indutria negativamente (27.37%), el crecimiento poblacional negativamente (18.23%) y las remesas positivamente (13.15%)

p2 <- plot_ly(var_df,
              x = ~Dim3, 
              y = ~Dim4,
              color = ~Contrib3,
              colors = colorRampPalette(c("#00AFBB", "#E7B800", "#FC4E07"))(100),
              text = ~paste("<b>", Variable, "</b><br>",
                            "Dim 3:", round(Dim3, 3), "<br>",
                            "Dim 4:", round(Dim4, 3), "<br>",
                            "<b>Contribución Dim 3:</b> ", round(Contrib3, 2), "%<br>",
                            "<b>Contribución Dim 4:</b> ", round(Contrib4, 2), "%<br>",
                            "Cos2 Dim 3:", round(Cos2_3, 3), "<br>",
                            "Cos2 Dim 4:", round(Cos2_4, 3)),
              type = "scatter",
              mode = "markers",
              marker = list(size = 12, opacity = 0.8, line = list(width = 2, color = "white")),
              hovertemplate = '%{text}<extra></extra>') %>%
  
  add_segments(x = 0, xend = ~Dim3, y = 0, yend = ~Dim4,
               line = list(color = "rgba(100, 100, 100, 0.3)", width = 1),
               showlegend = FALSE, hoverinfo = "skip") %>%
  
  layout(
    title = list(
      text = "Variables: Dimensión 3 vs Dimensión 4<br><sub>Coloreado por Contribución Dim 3</sub>",
      font = list(size = 16, color = "#2C5F8D")
    ),
    xaxis = list(title = "Dimensión 3", zeroline = TRUE, zerolinecolor = "gray"),
    yaxis = list(title = "Dimensión 4", zeroline = TRUE, zerolinecolor = "gray"),
    hovermode = "closest",
    plot_bgcolor = "white",
    paper_bgcolor = "white"
  )

p2

A la dimensión 3 las variables que más contribuyen son las importaciones negativamente (26.78%), las exportaciones negativamente (26.43%) y la inversión extranjera negativamente (13.2%). En la dimensión 4 las variables que más contribuyen son el area boscosa negativamente (29.47%), la tierra cultivable positivamente (26.32%)y la población positivamente (19.51%).

4.1.7 Análisis Integrado de Variables y Países

El análisis combinado de las variables y los países en el espacio reducido de los componentes principales permite identificar patrones de asociación estructural que trascienden el análisis univariable. La metodología del biplot permite vincular directamente las posiciones espaciales de los países con las magnitudes observadas en las variables originales, estableciendo relaciones interpretativas que evidencian cómo las características multidimensionales de desarrollo se manifiestan diferencialmente en distintos grupos de países (Jolliffe, 2002; Hastie et al., 2009).

Para comprender la lógica interpretativa del biplot, es fundamental reconocer que la posición de un país en relación a la dirección de una flecha de variable indica el valor relativo de ese país en esa variable específica. Países ubicados en la misma dirección que una flecha exhiben valores altos en esa variable; países ubicados en dirección opuesta exhiben valores bajos; países ubicados perpendicularmente (formando ángulos de ~\(90°\)) exhiben valores cercanos a la media global. Esta propiedad geométrica del biplot permite realizar diagnósticos cuantitativos directamente desde la visualización gráfica, sin necesidad de consultar la base de datos original, siempre que la calidad de representación (\(cos²\)) sea suficientemente alta (Jolliffe, 2002).

acp_prcomp <- prcomp(datos_analisis, center = TRUE, scale. = TRUE)
ind_data <- get_pca_ind(acp_prcomp)
var_data <- get_pca_var(acp_prcomp)


ind_df <- data.frame(
  Pais = rownames(ind_data$coord),
  Dim1 = ind_data$coord[, 1],
  Dim2 = ind_data$coord[, 2],
  Dim3 = ind_data$coord[, 3],
  Dim4 = ind_data$coord[, 4],
  Contrib1 = ind_data$contrib[, 1],
  Contrib2 = ind_data$contrib[, 2],
  Contrib3 = ind_data$contrib[, 3],
  Contrib4 = ind_data$contrib[, 4]
)

var_df <- data.frame(
  Variable = rownames(var_data$coord),
  Dim1 = var_data$coord[, 1] * 3,
  Dim2 = var_data$coord[, 2] * 3,
  Dim3 = var_data$coord[, 3] * 3,
  Dim4 = var_data$coord[, 4] * 3,
  Contrib1 = var_data$contrib[, 1],
  Contrib2 = var_data$contrib[, 2],
  Contrib3 = var_data$contrib[, 3],
  Contrib4 = var_data$contrib[, 4]
)

p1 <- plot_ly() %>%
  
  add_segments(
    data = var_df,
    x = 0, xend = ~Dim1, y = 0, yend = ~Dim2,
    line = list(color = "#2E9FDF", width = 2),
    showlegend = FALSE, hoverinfo = "skip"
  ) %>%
  
  add_trace(
    data = var_df,
    x = ~Dim1, y = ~Dim2,
    text = ~paste("<b>VARIABLE: ", Variable, "</b><br>",
                  "Dim 1:", round(Dim1/3, 3), "<br>",
                  "Dim 2:", round(Dim2/3, 3), "<br>",
                  "<b>Contribución Dim 1:</b> ", round(Contrib1, 2), "%<br>",
                  "<b>Contribución Dim 2:</b> ", round(Contrib2, 2), "%"),
    type = "scatter",
    mode = "markers",
    marker = list(size = 10, color = "#2E9FDF", opacity = 0.8, line = list(width = 2, color = "white")),
    hovertemplate = '%{text}<extra></extra>',
    name = "Variables"
  ) %>%
  
  add_trace(
    data = ind_df,
    x = ~Dim1, y = ~Dim2,
    text = ~paste("<b>PAÍS: ", Pais, "</b><br>",
                  "Dim 1:", round(Dim1, 3), "<br>",
                  "Dim 2:", round(Dim2, 3), "<br>",
                  "<b>Contribución Dim 1:</b> ", round(Contrib1, 2), "%<br>",
                  "<b>Contribución Dim 2:</b> ", round(Contrib2, 2), "%"),
    type = "scatter",
    mode = "markers",
    marker = list(size = 8, color = "#696969", opacity = 0.6, line = list(width = 1, color = "white")),
    hovertemplate = '%{text}<extra></extra>',
    name = "Países"
  ) %>%
  
  layout(
    title = list(
      text = "Biplot: Dimensión 1 vs Dimensión 2<br><sub>Azul = Variables | Gris = Países</sub>",
      font = list(size = 16, color = "#2C5F8D")
    ),
    xaxis = list(title = "Dimensión 1", zeroline = TRUE, zerolinecolor = "gray"),
    yaxis = list(title = "Dimensión 2", zeroline = TRUE, zerolinecolor = "gray"),
    hovermode = "closest",
    plot_bgcolor = "white",
    paper_bgcolor = "white",
    legend = list(x = 0.02, y = 0.98)
  )

p1

Senegal y Burkina Faso se alinean con la flecha de mortalidad infantil, confirmando valores altos en esa variable. Egipto se alinea con crecimiento poblacional, indicando tasa de crecimiento demográfico elevada. Corea del Sur y Nueva Zelanda se alinean con exportaciones, indicando economías muy orientadas a comercio externo. Suiza se alinea con esperanza de vida, confirmando longevidad excepcional.

En dirección opuesta: países desarrollados europeos se oponen a flechas de mortalidad y rezago, reflejando valores bajos en estos indicadores negativos. Honduras y República Kirguisa se alinean con remesas, indicando dependencia crítica de transferencias de migrantes.

p2 <- plot_ly() %>%
  
  add_segments(
    data = var_df,
    x = 0, xend = ~Dim3, y = 0, yend = ~Dim4,
    line = list(color = "#2E9FDF", width = 2),
    showlegend = FALSE, hoverinfo = "skip"
  ) %>%
  
  add_trace(
    data = var_df,
    x = ~Dim3, y = ~Dim4,
    text = ~paste("<b>VARIABLE: ", Variable, "</b><br>",
                  "Dim 3:", round(Dim3/3, 3), "<br>",
                  "Dim 4:", round(Dim4/3, 3), "<br>",
                  "<b>Contribución Dim 3:</b> ", round(Contrib3, 2), "%<br>",
                  "<b>Contribución Dim 4:</b> ", round(Contrib4, 2), "%"),
    type = "scatter",
    mode = "markers",
    marker = list(size = 10, color = "#2E9FDF", opacity = 0.8, line = list(width = 2, color = "white")),
    hovertemplate = '%{text}<extra></extra>',
    name = "Variables"
  ) %>%
  
  add_trace(
    data = ind_df,
    x = ~Dim3, y = ~Dim4,
    text = ~paste("<b>PAÍS: ", Pais, "</b><br>",
                  "Dim 3:", round(Dim3, 3), "<br>",
                  "Dim 4:", round(Dim4, 3), "<br>",
                  "<b>Contribución Dim 3:</b> ", round(Contrib3, 2), "%<br>",
                  "<b>Contribución Dim 4:</b> ", round(Contrib4, 2), "%"),
    type = "scatter",
    mode = "markers",
    marker = list(size = 8, color = "#696969", opacity = 0.6, line = list(width = 1, color = "white")),
    hovertemplate = '%{text}<extra></extra>',
    name = "Países"
  ) %>%
  
  layout(
    title = list(
      text = "Biplot: Dimensión 3 vs Dimensión 4<br><sub>Azul = Variables | Gris = Países</sub>",
      font = list(size = 16, color = "#2C5F8D")
    ),
    xaxis = list(title = "Dimensión 3", zeroline = TRUE, zerolinecolor = "gray"),
    yaxis = list(title = "Dimensión 4", zeroline = TRUE, zerolinecolor = "gray"),
    hovermode = "closest",
    plot_bgcolor = "white",
    paper_bgcolor = "white",
    legend = list(x = 0.02, y = 0.98)
  )

p2

Guinea se posiciona en la dirección de crecimiento poblacional, indicando valores altos en esta variable. Kuwait y Djibouti se alinean con importaciones, indicando ratios elevados. Senegal e Irlanda se alinean con exportaciones, indicando orientación exportadora. Burkina Faso y Qatar se alinean con mortalidad infantil, indicando valores en esta variable. Macedonia del Norte se alinea con PIB per cápita, indicando ingreso por habitante en esa dirección.

4.2 Segmentación: Clusterización

Sobre la base de los k componentes principales retenidos del Análisis de Componentes Principales, se aplicó el método de Ward para clusterización jerárquica aglomerativa. Este algoritmo organiza los datos con el objetivo de determinar clusters de países mediante un enfoque que se basa en la distancia entre los puntos para mostrar posibles agrupamientos. El procedimiento iterativo de fusión permite identificar estructuras naturales de similitud que trascienden clasificaciones geográficas o económicas convencionales, revelando en cambio grupos de países que comparten perfiles multidimensionales coherentes de desarrollo (Ward, 1963; Hastie et al., 2009).

El método de Ward minimiza específicamente la suma total de cuadrados dentro de clusters (within-cluster sum of squares, WCSS), definida matemáticamente como:

\[WCSS = \sum_{c=1}^{C} \sum_{i \in c} ||x_i - \bar{c}||^2\]

donde: - \(C\) es el número de clusters, - \(x_i\) es la posición de la observación \(i\) en el espacio de componentes principales, - \(\bar{c}\) es el centroide (promedio) del cluster \(c\).

En cada paso del algoritmo, se identifican los dos clusters cuya fusión produce el incremento mínimo en WCSS total, maximizando así la homogeneidad interna de cada cluster mientras se maximiza la disimilaridad entre clusters (Ward, 1963; Hastie et al., 2009).

resultado_ACP <- FactoClass(datos_analisis, dudi.pca, nf = 3, scan = FALSE)
## The number of retained axes for factorial analysis is  3 
## 
## The number of axes for clustering is  10
## Look the histogram of 25 indexes 
## Partition in  3  clusters
clusters_asignados <- resultado_ACP$cluster
cat("Número de países por cluster:\n")
## Número de países por cluster:
print(table(clusters_asignados))
## clusters_asignados
##  1  2  3 
## 84 32 20
NuevaBase <- data.frame(Cluster = clusters_asignados, Base_2022)
distribucion_clusters <- table(clusters_asignados) %>%
  as.data.frame() %>%
  rename(Cluster = clusters_asignados, Frecuencia = Freq) %>%
  mutate(Porcentaje = round(Frecuencia/sum(Frecuencia)*100, 2))

tabla_distribucion <- distribucion_clusters %>%
  gt() %>%
  tab_header(
    title = md("**Tabla 12**"),
    subtitle = "Distribución de Países por Cluster"
  ) %>%
  cols_label(
    Cluster = md("**Cluster**"),
    Frecuencia = md("**N° Países**"),
    Porcentaje = md("**Porcentaje (%)**")
  ) %>%
  fmt_number(
    columns = Porcentaje,
    decimals = 1,
    pattern = "{x}%"
  ) %>%
  tab_options(
    table.font.names = "Times New Roman"
  )

tabla_distribucion
Tabla 12
Distribución de Países por Cluster
Cluster N° Países Porcentaje (%)
1 84 61.8%
2 32 23.5%
3 20 14.7%
par(mfrow = c(2, 2), mar = c(4, 4, 2, 1))

plot(resultado_ACP$dudi, main = "Análisis Factorial y Clusterización")

s.corcircle((resultado_ACP$dudi)$co, sub = "Círculo de Correlaciones")

Grupo <- as.factor(NuevaBase$Cluster)
s.class((resultado_ACP$dudi)$li, Grupo, 
        sub = "Países por Cluster - Componentes 1-2", 
        col = c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"),
        xax = 1, yax = 2)

s.class((resultado_ACP$dudi)$li, Grupo,
        sub = "Países por Cluster - Componentes 1-3", 
        col = c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"),
        xax = 1, yax = 3)

# Calcular matriz de distancias y crear dendrograma manualmente
coordenadas_componentes <- resultado_ACP$dudi$li[, 1:3]
distancias <- dist(coordenadas_componentes, method = "euclidean")

# Aplicar clusterización jerárquica con método de Ward
hc <- hclust(distancias, method = "ward.D2")

# Crear dendrograma con colores
library(dendextend)
dend <- as.dendrogram(hc)

# Obtener número de clusters del análisis original
k <- length(unique(resultado_ACP$cluster))

# Colorear las ramas según los clusters
dend_colored <- color_branches(dend, k = k)

# Configurar márgenes para mejor visualización
par(mar = c(5, 4, 4, 8) + 0.1)

# Graficar el dendrograma
plot(dend_colored,
     main = "Dendrograma - Clusterización Jerárquica (Método Ward)",
     xlab = "Países",
     ylab = "Distancia Euclidiana",
     cex = 0.6,
     horiz = FALSE)

# Añadir leyenda
legend("topright", 
       legend = paste("Cluster", 1:k),
       fill = unique(get_leaves_branches_col(dend_colored)),
       cex = 0.8,
       inset = c(-0.15, 0),
       xpd = TRUE)

# Añadir líneas que muestran el corte para k clusters
abline(h = hc$height[length(hc$height) - k + 1], 
       col = "red", lty = 2, lwd = 2)
text(x = length(hc$labels) * 0.8, 
     y = hc$height[length(hc$height) - k + 1],
     labels = paste("Corte para", k, "clusters"),
     col = "red", pos = 3)

5 Bibliografia